%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Solveur d'un problème éléments finis 1D encastré en 0
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


function [ resultat,donneesAdaptees ] = Solveur( donnees, efforts, typeResolution )

maillage = donnees.maillage ;

K = AssemblageRigidite(maillage,donnees.poutre) ;

C = [1,zeros(1,2*length(maillage)-1);
    0,1,zeros(1,2*length(maillage)-2)];
Klag = [K ,C';C,[0,0;0,0]];

donneesAdaptees=donnees;

if strcmp(typeResolution,'adjoint')==1
    donneesAdaptees.F=1;
    donneesAdaptees.forceLineiqueA=0;
    donneesAdaptees.forceLineiqueB=0;
    donneesAdaptees.forceLineiqueC=1;
elseif strcmp(typeResolution,'direct')==1
else
    disp('Le type de résolution demandé n''existe pas. Les choix possibles sont ''directe'' et ''adjoint''.');
    
    disp('You chose to cancel. Quit the program now?');
    disp('<a href="MATLAB: dbquit;">Yes</a> / <a href="MATLAB: dbcont;">No</a>');
    keyboard;
    
end

force = [zeros(2*(length(maillage)),1)] ;

if strcmp(efforts,'ponctuel')==1
    donneesAdaptees.forceLineiqueA=0;
    donneesAdaptees.forceLineiqueB=0;
    donneesAdaptees.forceLineiqueC=0;
    force = force+[zeros(2*(length(maillage)-1),1);donneesAdaptees.F;0] ;
elseif strcmp(efforts,'moment')==1
    donneesAdaptees.F=0;
    donneesAdaptees.forceLineiqueA=0;
    donneesAdaptees.forceLineiqueB=0;
    donneesAdaptees.forceLineiqueC=0;
    force = force+[zeros(2*(length(maillage)-1),1);0;donneesAdaptees.F] ;
elseif strcmp(efforts,'2moments')
    donneesAdaptees.F=0;
    donneesAdaptees.forceLineiqueA=0;
    donneesAdaptees.forceLineiqueB=0;
    donneesAdaptees.forceLineiqueC=0;
    n1= donnees.erreurLocaleMoyenneMoment.n1;
    n2= donnees.erreurLocaleMoyenneMoment.n2;
    force(2*n1) = force(2*n1) - (donnees.poutre.E*donnees.poutre.I)/(maillage(n2)-maillage(n1));
    force(2*n2) = force(2*n2) + (donnees.poutre.E*donnees.poutre.I)/(maillage(n2)-maillage(n1));
elseif strcmp(efforts,'reparti')==1
    donneesAdaptees.F=0;
    force = force+ second_membre_lineique(donneesAdaptees,maillage);
elseif strcmp(efforts,'ponctuelETreparti')==1
    force = force+second_membre_lineique(donneesAdaptees,maillage)+[zeros(2*(length(maillage)-1),1);donneesAdaptees.F;0] ;
end

forceLag = [force;0;0];

U = Klag\forceLag ;
resultat = U(1:length(U)-2) ;

% plot(resultat);

end

